JDBCJDBC事务(单机事务)
CAMELLIA!!! note 目录
JDBC事务(单机事务)
JDBC单机事务是指在单个数据库连接上执行一系列数据库操作,以确保这些操作要么全部成功,要么全部失败,从而保证数据的完整性和一致性。
一、JDBC事务机制
- 默认情况下,JDBC 连接是自动提交的,每个独立的SQL语句都会被视为一个事务并立即提交。
- 但是在实际业务中,通常是多条DML语句共同联合才能完成,必须保证这些DML语句在同一个事务中同时成功或者同时失败。
- 所以,要管理事务,首先需要关闭自动提交模式。
二、开启JDBC单机事务的三大步
开启事务(关闭自动提交)
若要开启事务,一般在连接数据库的时候就关闭自动提交。
1 2 3
| connection= DriverManager.getConnection(url,username,password);
connection.setAutoCommit(false);
|
提交事务
在获取异常catch
之前关闭事务,因为执行到这说明以上程序没有问题,事务结束,手动提交。
回滚事务
捕获异常之后,回滚事务。
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| @Test public void testTransaction() { ResourceBundle rb = ResourceBundle.getBundle("jdbc"); String driver = rb.getString("driver"); String url = rb.getString("url"); String password = rb.getString("password"); String username = rb.getString("username"); Connection connection = null; PreparedStatement preparedStatement = null; try{ Class.forName(driver); connection= DriverManager.getConnection(url,username,password); connection.setAutoCommit(false); String sql="update t_act set balance=? where actno=? "; preparedStatement=connection.prepareStatement(sql); preparedStatement.setDouble(1,10000); preparedStatement.setInt(2,1001); int count=preparedStatement.executeUpdate(); preparedStatement.setDouble(1,10000); preparedStatement.setInt(2,1002); count+=preparedStatement.executeUpdate(); System.out.println(count==2?"success":"fail"); connection.commit(); }catch (ClassNotFoundException e){ e.printStackTrace(); }catch (SQLException e){ e.printStackTrace(); } finally { if(preparedStatement != null){try{preparedStatement.close();}catch(SQLException e){e.printStackTrace();}} if(connection != null){try{connection.close();}catch(SQLException e){e.printStackTrace();}} }
}
|
注意:单机事务这么写。